TFM Kaggle

1) Estadística descriptiva

Vemos que son 21.742 registros sobre los que se evalúan 58 características.

1. Establecemos el índice para el conjunto de datos

Creemos conveniente convertir alguna de las columnas en el índice del dataset, si es posible. A priori, tanto la columna "ID" como "Unnamed: 0" parece que puede ser el índice del conjunto de datos, pues debe ser un identificador único.

Lo comprobamos y vemos que ambas columnas tienen entradas únicas, por lo que podemos definir cualquiera de las dos variables como el índice del dataset.

2. Estudiamos los elementos duplicados

Sin embargo, si no tenemos en cuenta el ID (que vimos que era único para cada registro) y nos fijamos en el resto de campos, vemos que sí hay registros duplicados.

En este caso, creemos que un mismo inmueble puede estar publicado por dos o más agencias diferentes, lo que explicaría este comportamiento. Intentaríamos conseguir más información sobre esto, pero suponiendo que sí sea posible ya que es elección del propietario (hipótesis), consideramos eliminar los registros duplicados, quedándonos con un único ejemplo en cada caso.

3. Tipo de datos

Indicamos qué recoge cada variable:

Infiriendo qué recoge cada uno de los datos que hemos descargado a partir de la web y de la observación del dataset, creemos que sería necesario implementar varias modificaciones para transformar las variables al tipo más adecuado. Sin embargo, no lo vamos a realizar ahora, sino que vamos a seguir con los siguientes puntos y lo tendremos en cuenta si es necesario transformarlo más adelante.

4. Exploración y tratamiento de los datos faltantes

Si analizamos los NA's, vemos que gran parte de las variables que estamos teniendo en cuenta tienen datos faltantes. En término porcentuales, casi supone el 44% de los datos totales, por lo que es necesaria una limpieza exhaustiva de los mismos.

A continuación, realizamos un estudio de estas variables para identificar la razón por la que hay datos faltantes e intentar encontrar la manera de rellenarlos. Implementaremos algunas técnicas que pueden ayudarnos con los valores perdidos, pero tenemos en cuenta que probablemente también acabarán eliminando alguna información útil o añadiendo algo de ruido a nuestros datos.

CASO 0: Hay valores faltantes en todos los registros de la variable

Este es el caso de rent_price_by_area, are_pets_allowed, has_private_parking, is_kitchen_equipped, has_public_parking, door, portal, latitude, longitude y is_furnished. Dado que no aportan ninguna información para la predicción, decidimos eliminarlas de nuestro conjunto de datos.

CASO 1: Los valores faltantes corresponden a una categoría de la variable

CASO 2: Los valores faltantes corresponden a datos no registrados por error

Comprobamos que se han implementado correctamente los datos y ya no tenemos ningún valor faltante en el dataset.

5. Exploración y tratamiento de datos atípicos

En este punto, vamos a revisar las características de cada columna restante en el dataset, centrándonos en los valores que toma cada variable y concretamente, en si existe algún valor atípico (outlier) dentro de nuestros datos.

Estos pueden tener diferentes significados: tratarse de un error en el registro de los datos, escaparse simplemente del rango donde se concentran la mayoría de valores pero ser un dato válido o puede que sea un dato que queremos detectar y que sea el objetivo del estudio. En cada caso, definiremos la estrategia que consideras más adecuada para tratarlos.

6. Gráficos

Atendiendo a la estadística descriptiva, vemos que el tamaño medio construido de las propiedades es en torno a los 145 m2, encontrando que el registro más pequeño tiene tan solo 13 m2, mientras que el mayor casi alcanza los 1.000 m2. Por otra parte, cabe destacar que las propiedades en Madrid se componen por 1 piso con 3 habitaciones y 2 baños, en mediana.

El precio medio de venta de las propiedades supera los 650.000€, alcanzando el inmueble más caro un precio de casi 9M, mientras que el más barato se vende por 36.000€. Por su parte, la plaza de parking ronda un precio medio de 940€. Resalta también el dato de que en Madrid, el precio medio de venta por zona supera ligeramente los 4.000 €/m2.

Por otra parte, el perfil del inmueble prototipo que encontramos es un piso en venta, de una planta y ubicado en el barrio de Malasaña-Universidad, aunque cuya dirección exacta está oculta. No tiene ningún piso vecino en la planta de abajo, su certificación energética está en trámite y a pesar de que no es de obra nueva, tampoco necesita reforma.

También se sabe que es exterior, tiene aire acondicionado, armarios empotrados y ascensor, pero no cuenta con plaza de aparcamiento, jardín, zonas verdes, piscina, terraza ni balcón, así como tampoco tiene una habitación habilitada como espacio de almacenamiento ni se considera un piso accesible.

A continuación, decidimos realizar varios gráficos que nos representen a simple vista, los datos que hemos ido analizando.

7. Discretización de variables

Para algunos algoritmos de Machine Learning, será necesario tener las variables categóricas en formato numérico. Para ello, en este punto, vamos a utilizar diferentes técnicas para la discretización de las columnas no numéricas, para poder ser tratadas por estos algoritmos. Para ello, habiendo visto cómo se distribuyen los valores de cada una de las variables, las podemos discretizar de diferente forma.

En nuestro caso, las variables categóricas son:

#### Variable "district"
# Convertimos la variable a numérico. Es decir, le asignamos un número a cada valor actual.

# Ya disponíamos de esta variable en la API también (por lo que podríamos aplicar la misma asignación barrio - número que aquí)
# Sin embargo, al no tratare de demasiados valores, decidimos aplicar One-hot encoding (a continuación)

# Partimos del mapping generado para la API (que tenía los 21 distritos, en Kaggle sólo tenemos 20)
mapping_district_API = {'Carabanchel': 0, 'Chamberí': 1, 'Centro': 2, 'Chamartín': 3, 'Arganzuela': 4,
                        'Ciudad Lineal': 5, 'Tetuán': 6, 'Fuencarral': 7, 'Retiro': 8, 'Barrio de Salamanca': 9,
                        'Hortaleza': 10, 'Puente de Vallecas': 11, 'San Blas': 12, 'Usera': 13, 'Moncloa': 14,
                        'Latina': 15, 'Villaverde': 16, 'Villa de Vallecas': 17, 'Vicálvaro': 18, 'Barajas': 19,
                        'Moratalaz': 20}

# Por tanto, sólo tenemos que sustituir en este caso los valores de la columna por nuestro mapeo 
df_kaggle_discretizado["district"] = df_kaggle_discretizado["district"].replace(mapping_district_API)

Por último, mostramos cómo ha quedado el dataframe, viendo que las columnas dummies se han añadido al final:

Unificamos los formatos de df_kaggle y df_API

Dado que train (df_Kaggle) y test (df_API) deben tener el mismo esqueleto, tenemos que realizar una serie de operaciones.

Este dataset con datos extraídos de Kaggle, va a ser el dataset de entrenamiento + validación.

Ya estamos en disposición de entrenar modelos de ML para predecir los precios de los inmuebles.